<!doctype html>
<html lang="en">

	<head>
		<meta charset="utf-8">

		<title>Node.js Introduction</title>

		<meta name="description" content="This is a smiple introduction to Node.js.">
		<meta name="author" content="refrain">

		<meta name="apple-mobile-web-app-capable" content="yes">
		<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">

		<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

		<link rel="icon" href="http://static2.cnodejs.org/public/images/cnode_icon_32.png" type="image/x-icon">
		<link rel="stylesheet" href="css/reveal.css">
		<link rel="stylesheet" href="css/theme/black.css" id="theme">

		<!-- Theme used for syntax highlighting of code -->
		<link rel="stylesheet" href="lib/css/zenburn.css">
		<style type="text/css">
			button {
				width: 150px;
				height: 60px;
				font-size: 20px;
				border-radius: 2px;
			}
			input {
				width: 250px;
				height: 60px;
				font-size: 25px;
			}
			#focus_show {
				display: none;
			}

			#panel,#flip
			{
				padding:5px;
				text-align:center;
				background-color:#42affa;
				color: #fff;
			}
			#panel
			{
				padding:50px;
				display:none;
			}
		</style>
		<!-- Printing and PDF exports -->
		<script>
			var link = document.createElement( 'link' );
			link.rel = 'stylesheet';
			link.type = 'text/css';
			link.href = window.location.search.match( /print-pdf/gi ) ? 'css/print/pdf.css' : 'css/print/paper.css';
			document.getElementsByTagName( 'head' )[0].appendChild( link );
		</script>

		<!--[if lt IE 9]>-->
		<script src="lib/js/html5shiv.js"></script>
	</head>

	<body>

		<div class="reveal">

			<!-- Any section element inside of this container is displayed as a slide -->
			<div class="slides">
				<section>
					<section>
						<h2>Node.js</h2>
						<!-- <p class="fragment">Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine.</p> -->
						<p class="fragment">简单的说 Node.js 就是运行在服务端的 JavaScript</p>
						<a class="fragment" href="https://nodejs.org/en/" target="_blank">
							<img width="240" height="180" data-src="https://nodejs.org/static/images/logo.svg" alt="nodejs_logo">
						</a>
					</section>

					<section>
						<h2>Node.js简介</h2>
						<p class="fragment"><a href="#/1">Node.js 是什么</a></p>
						<p class="fragment"><a href="#/2">Node.js 创建第一个应用</a></p>
						<p class="fragment"><a href="#/3">Node.js 优缺点及适用场景</a></p>
					</section>
				</section>

				<!-- What is Node.js -->
				<section>
					<section>
						<h2 class="fragment">Node.js 是什么</h2>
						<p>首先，Node.js并不是一门语言<p>
						<p class="fragment">Node.js is a <em style="color: #42affa;">JavaScript runtime</em> built on Chrome's V8 JavaScript engine. -- Nodejs.org</p>
					</section>

					<section>
						<img width="700" height="450" data-src="image/node.jpg" alt="libuv" title="libuv">
						<p class="fragment">Node.js是一系列优秀项目的封装</p>
					</section>
					
					<section>
						<img width="700" height="450" data-src="image/libuv.jpg">
						<p class="fragment">
							<small>
								libuv是一个多平台的，主要用于处理事件驱动的异步I/O模型库。
							</small>
						</p>
						<p class="fragment">
								<small>
									libuv还为Node.js提供了fs, DNS, 网络, 子进程, 管道, 信号处理, 流处理等等。
								</small>
							</p>
					</section>

					<section>
						<h3>Node.js 模块</h3>
						<p class="fragment">除了牵手v8 engine和libuv外，Node.js本身也做了不少工作。提供了包括JS模块，C++模块在内的核心模块供开发者使用。</p>
					</section>
				</section>

				<!-- first demo -->
				<section>
					<section>
						<h2>Node.js 创建第一个应用</h2>
						<p class="fragment">
							<small>
								新建一个server.js文件，在命令行运行node server.js命令，就可以运行一个服务器
							</small>
						</p>
						<img data-src="image/carbon.png" alt="" class="fragment">
					</section>
				</section>

				<!--  -->
				<section>
					<section>
						<h2>Node.js 优缺点及适用场景</h2>
						<h3 class="fragment">Nodejs的优势</h3>
						<ul>
							<li class="fragment">易上手，前后端语言统一</li>
							<li class="fragment">处理高并发场景性能更高</li>
							<li class="fragment">适合I/O密集型应用</li>
						</ul>

						<!-- <p>
							Node.js处理高并发的解决方式：
								更改连接到服务器的方式。
								每个连接发射一个在Node.js引擎的进程中运行的事件，而不是为每个连接生成一个新的OS线程（并为其分配一些配套内存）。
								Node.js不会死锁，因为它根本不允许使用锁，它不会直接阻塞 I/O 调用。
								Node.js还宣称，运行它的服务器能支持数万个并发连接。
						</p> -->
					</section>
					
					<section>
						<h3 class="fragment">Nodejs的劣势</h3>
						<ul>
							<li class="fragment">不适合CPU密集型应用</li>
							<li class="fragment">只支持单核CPU，不能充分利用CPU</li>
							<li class="fragment">可靠性低，一旦代码某个环节崩溃，整个系统都崩溃</li>
						</ul>
					</section>

					<section>
							<h3 class="fragment">适用性场景</h3>
							<ul>
								<li class="fragment">高并发场景： web 实时推送等</li>
								<li class="fragment">中间层、BFF等</li>
								<li class="fragment">工具类,如Webpack、Gulp等</li>
								<li class="fragment">Serverless</li>
							</ul>

							<!-- <p>
								通常在开发应用时，出于安全考虑，后端的主服务器都不会直接暴露给客户端，两端之间通常需要有一个中间层进行通信。

								这样做的好处是，如果中间层出现问题，不会影响后端的主服务器。另外，中间层可以做缓存，或者实现一些业务逻辑，起到降低主服务器复杂度，提高性能的作用。
								
								中间层也可以像CDN一样在各处部署，以提高用户的访问效率。
							</p> -->
					</section>
				</section>

				<section style="text-align: left;">
					<h2>参考文章</h2>
					<p>
						[1] <a href="https://nodejs.org/">Node.js官网</a> <br>	
						[2] <a href="https://www.itcodemonkey.com/article/13870.html">Node.js十年：十年之前，我不认识你</a> <br>
						[3] <a href="https://developers.google.com/v8/intro">V8文档</a><br>
						[4] <a href="http://nikhilm.github.io/uvbook/">libuv入门以及API参考文档</a><br>
						[5] <a href="https://www.sitepoint.com/node-js-is-the-new-black/">Node.js is the New Black</a><br>
						[6] <a href="https://github.com/hakimel/reveal.js">reveal.js</a>
					</p>
				</section>

				<section>
					<h1>END</h1>
				</section>
			</div>

		</div>

		<script src="js/reveal.js"></script>


		<script>

			// More info https://github.com/hakimel/reveal.js#configuration
			Reveal.initialize({
				controls: true,
				progress: false,
				history: true,
				center: true,

				transition: 'zoom', // none/fade/slide/convex/concave/zoom

				// More info https://github.com/hakimel/reveal.js#dependencies
				dependencies: [
					{ src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } },
					{ src: 'plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
					{ src: 'plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
					{ src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
					{ src: 'plugin/search/search.js', async: true },
					{ src: 'plugin/zoom-js/zoom.js', async: true },
					{ src: 'plugin/notes/notes.js', async: true }
				]
			});

		</script>
	</body>
</html>
